This commit is contained in:
龙腾猫跃
2026-04-02 17:48:49 +08:00
parent c850596cab
commit 36b5bcbef4
20 changed files with 215 additions and 25979 deletions
@@ -1,4 +1,6 @@
Public Module ModComp
Imports System.IO.Compression
Public Module ModComp
<Flags> Public Enum CompType
''' <summary>
@@ -58,37 +60,39 @@
'初始化数据库
_CompDatabase = New List(Of CompDatabaseEntry)
Dim i As Integer = 0
For Each Line In DecodeBytes(GetResources("ModData")).Replace(vbCrLf, vbLf).Replace(vbCr, "").Split(vbLf)
i += 1
If Line = "" Then Continue For
For Each EntryData As String In Line.Split("¨")
Dim Entry = New CompDatabaseEntry
Dim Splited = EntryData.Split("|")
Entry.Popularity = Val(Splited(0))
If Splited(1).StartsWithF("@") Then
Entry.CurseForgeSlug = Nothing
Entry.ModrinthSlug = Splited(1).Replace("@", "")
ElseIf Splited(1).EndsWithF("@") Then
Entry.CurseForgeSlug = Splited(1).TrimEnd("@")
Entry.ModrinthSlug = Entry.CurseForgeSlug
ElseIf Splited(1).Contains("@") Then
Entry.CurseForgeSlug = Splited(1).Split("@")(0)
Entry.ModrinthSlug = Splited(1).Split("@")(1)
Else
Entry.CurseForgeSlug = Splited(1)
Entry.ModrinthSlug = Nothing
End If
Entry.WikiId = i
If Splited.Count >= 3 Then
Entry.ChineseName = Splited.Last
If Entry.ChineseName.Contains("*") Then '处理 *
Entry.ChineseName = Entry.ChineseName.Replace("*",
$" ({If(Entry.CurseForgeSlug, Entry.ModrinthSlug).Replace("-", " ").Capitalize})")
Using Archive As New ZipArchive(New MemoryStream(GetResources("ModData")), ZipArchiveMode.Read)
For Each Line In ReadFile(Archive.GetEntry("moddata.txt").Open(), Encoding.UTF8).Replace(vbCrLf, vbLf).Replace(vbCr, "").Split(vbLf)
i += 1
If Line = "" Then Continue For
For Each EntryData As String In Line.Split("¨")
Dim Entry = New CompDatabaseEntry
Dim Splited = EntryData.Split("|")
Entry.Popularity = Val(Splited(0))
If Splited(1).StartsWithF("@") Then
Entry.CurseForgeSlug = Nothing
Entry.ModrinthSlug = Splited(1).Replace("@", "")
ElseIf Splited(1).EndsWithF("@") Then
Entry.CurseForgeSlug = Splited(1).TrimEnd("@")
Entry.ModrinthSlug = Entry.CurseForgeSlug
ElseIf Splited(1).Contains("@") Then
Entry.CurseForgeSlug = Splited(1).Split("@")(0)
Entry.ModrinthSlug = Splited(1).Split("@")(1)
Else
Entry.CurseForgeSlug = Splited(1)
Entry.ModrinthSlug = Nothing
End If
End If
_CompDatabase.Add(Entry)
Entry.WikiId = i
If Splited.Count >= 3 Then
Entry.ChineseName = Splited.Last
If Entry.ChineseName.Contains("*") Then '处理 *
Entry.ChineseName = Entry.ChineseName.Replace("*",
$" ({If(Entry.CurseForgeSlug, Entry.ModrinthSlug).Replace("-", " ").Capitalize})")
End If
End If
_CompDatabase.Add(Entry)
Next
Next
Next
End Using
Return _CompDatabase
End Get
End Property
@@ -322,7 +326,7 @@
Next
CurseForgeFileIds = Files.Select(Function(f) f.Key).Distinct.ToList
Drops = Files.SelectMany(Function(f) f.Value).
Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v > 0).Distinct.OrderByDescending(Function(v) v).ToList
Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v <> 209).Distinct.OrderByDescending(Function(v) v).ToList
ModLoaders = ModLoaders.Distinct.OrderBy(Of Integer)(Function(t) t).ToList
'Tags
Tags = New List(Of String)
@@ -418,7 +422,7 @@
'GameVersions
'搜索结果的键为 versions,获取特定工程的键为 game_versions
UnsafeGameVersions = If(CType(If(Data("game_versions"), Data("versions")), JArray), New JArray).Select(Function(v) v.ToString).Distinct.ToList
Drops = UnsafeGameVersions.Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v > 0).Distinct.OrderByDescending(Function(v) v).ToList
Drops = UnsafeGameVersions.Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v <> 209).Distinct.OrderByDescending(Function(v) v).ToList
'Type
Select Case Data("project_type").ToString
Case "modpack" : Types = CompType.ModPack
@@ -1100,7 +1104,7 @@ NextPage:
'在 1.14-,部分老 Mod 没有设置支持的加载器,因此添加 Forge 筛选就会出现遗漏
'所以,在发起请求时不筛选加载器,然后在返回的结果中自行筛除不是 Forge 的 Mod
Dim IgnoreModLoaderFilter = Request.ModLoader = CompModLoaderType.Forge AndAlso McVersion.VersionToDrop(Request.GameVersion, True) < 140
Dim IgnoreModLoaderFilter = Request.ModLoader = CompModLoaderType.Forge AndAlso McVersion.VersionToDrop(Request.GameVersion) < 140
Try
'CurseForge 搜索
@@ -213,6 +213,7 @@
For Each Version As JObject In Loader.Output.Value("versions")
Drops.Add(McVersion.VersionToDrop(Version("id")))
Next
Drops.Remove(209)
AllDrops = Drops.Distinct.OrderByDescending(Function(d) d).ToList()
End Sub
@@ -1422,14 +1422,14 @@ NextInstance:
End If
Args.Add("-Doolloo.jlw.tmpdir=${pure_directory}") '这里需要不以 \ 结尾
End If
McLaunchLog("使用 JLW:" & UseJLW)
'LUA
Dim UseLUA As Boolean =
Not Settings.Get("LaunchAdvanceDisableLUA") AndAlso Not Settings.Get("VersionAdvanceDisableLUA", McInstanceSelected) AndAlso
McLaunchJavaSelected.MajorVersion >= 25
If UseLUA Then
Args.Add($"-javaagent:""{ExtractPatch("LUA")}""")
End If
McLaunchJavaSelected.MajorVersion >= 25 AndAlso McInstanceSelected.Version.Drop >= 261
If UseLUA Then Args.Add($"-javaagent:""{ExtractPatch("LUA")}""")
McLaunchLog("使用 LUA:" & UseLUA)
#Region "内存管理"
@@ -170,7 +170,7 @@ Public Module ModMinecraft
#Region "版本处理"
Public Const McInstanceCacheVersion As Integer = 33
Public Const McInstanceCacheVersion As Integer = 34
Private _McInstanceSelected As McInstance
''' <summary>
@@ -444,21 +444,7 @@ Public Module ModMinecraft
VersionSearchFinish:
'获取版本号
_Version.VanillaName = _Version.VanillaName.Replace("_unobfuscated", "").Replace(" Unobfuscated", "")
If _Version.VanillaName.StartsWithF("1.") Then
Dim Segments = _Version.VanillaName.Split(" _-.".ToCharArray)
_Version.Vanilla = New Version(
Val(If(Segments.Count >= 2, Segments(1), "0")),
0,
Val(If(Segments.Count >= 3, Segments(2), "0")))
ElseIf RegexCheck(_Version.VanillaName, "^[2-9][0-9]\.") Then
Dim Segments = _Version.VanillaName.Split(" _-.".ToCharArray)
_Version.Vanilla = New Version(
Val(Segments(0)),
Val(If(Segments.Count >= 2, Segments(1), "0")),
Val(If(Segments.Count >= 3, Segments(2), "0")))
Else
_Version.Vanilla = New Version(9999, 0, 0)
End If
_Version.Vanilla = McVersion.NameToVersion(_Version.VanillaName)
Return _Version
End Get
Set(value As McVersion)
@@ -761,7 +747,8 @@ Recheck:
Case Else '根据 API 进行筛选
Dim RealJson As String = If(JsonObject, JsonText).ToString
'愚人节与快照版本
If If(JsonObject("type"), "").ToString = "fool" OrElse GetMcFoolName(Version.VanillaName) <> "" Then
If If(JsonObject("type"), "").ToString = "fool" OrElse
(ReleaseTime.ToUniversalTime.Month = 4 AndAlso ReleaseTime.ToUniversalTime.Day = 1) OrElse GetMcFoolName(Version.VanillaName) <> "" Then
State = McInstanceState.Fool
ElseIf IsSnapshot() Then
State = McInstanceState.Snapshot
@@ -1126,23 +1113,14 @@ ExitDataLoad:
Return False
End Function
''' <summary>
''' 尝试将版本字符串转换为 Drop 序数。
''' 若无法转换则返回 0。
''' 将版本名转换为 Drop 序数。
''' 若无法转换则返回 209。
''' </summary>
Public Shared Function VersionToDrop(Version As String, Optional AllowSnapshot As Boolean = False) As Integer
If Not AllowSnapshot AndAlso Version.Contains("-") Then Return 0
If Version Is Nothing Then Return 0
Dim Segments = Version.BeforeFirst("-").Split(".")
If Segments.Length < 2 Then Return 0
Dim Major As Integer = Val(Segments(0))
Dim Minor As Integer = Val(Segments(1))
If Major = 1 Then
Return Minor * 10
ElseIf Major < 25 Then
Return 0
Else
Return Major * 10 + Minor
End If
Public Shared Function VersionToDrop(VanillaName As String) As Integer
If VanillaName Is Nothing Then Return 209
Dim Version = NameToVersion(VanillaName)
If Version.Major >= 1000 Then Return 209
Return Version.Major * 10 + Version.Minor
End Function
''' <summary>
''' 将 Drop 序数转换为版本字符串。
@@ -1150,10 +1128,36 @@ ExitDataLoad:
Public Shared Function DropToVersion(Drop As Integer) As String
If Drop >= 250 Then
Return $"{Drop \ 10}.{Drop Mod 10}"
ElseIf Drop = 209 Then
Log("[Minecraft] 尝试将旧快照版 Drop 序数转换为版本字符串,这不应该发生!" & vbCrLf & GetStackTrace(), LogLevel.Debug)
Return "1.20"
Else
Return $"1.{Drop \ 10}"
End If
End Function
''' <summary>
''' 将版本名转换为可比较的三段式原版版本号。
''' 对老版本格式,例如 1.20.3,会被转换为 20.0.3。
''' 若没有版本号,例如旧快照,则为 9999.0.0。
''' </summary>
Public Shared Function NameToVersion(VanillaName As String) As Version
VanillaName = VanillaName.Replace("_unobfuscated", "").Replace(" Unobfuscated", "")
If VanillaName.StartsWithF("1.") Then
Dim Segments = VanillaName.Split(" _-.".ToCharArray)
Return New Version(
Val(If(Segments.Count >= 2, Segments(1), "0")),
0,
Val(If(Segments.Count >= 3, Segments(2), "0")))
ElseIf RegexCheck(VanillaName, "^[2-9][0-9]\.") Then
Dim Segments = VanillaName.Split(" _-.".ToCharArray)
Return New Version(
Val(Segments(0)),
Val(If(Segments.Count >= 2, Segments(1), "0")),
Val(If(Segments.Count >= 3, Segments(2), "0")))
Else
Return New Version(9999, 0, 0)
End If
End Function
End Class
@@ -1180,6 +1184,8 @@ ExitDataLoad:
Return "2024 | 毒马铃薯一直都被大家忽视和低估,于是我们超级加强了它!"
ElseIf Name = "25w14craftmine" Then
Return "2025 | 你可以合成任何东西——包括合成你的世界!"
ElseIf Name = "26w14a" Then
Return "2026 | 为什么需要物品栏?让方块们跟着你走吧!"
Else
Return ""
End If