Prefer Quilt files to Fabric files from CurseForge (fixes #128)

This commit is contained in:
comp500 2023-02-18 00:14:44 +00:00
parent d38d279d98
commit 4b336e46e2

View File

@ -244,29 +244,46 @@ func getSearchLoaderType(pack core.Pack) modloaderType {
} }
} }
func matchLoaderType(packLoaders []string, modLoaderType modloaderType) bool { // Crude way of preferring Quilt to Fabric: larger types are preferred
// so Quilt > Fabric > Forge > Any
func filterLoaderTypeIndex(packLoaders []string, modLoaderType modloaderType) (modloaderType, bool) {
if len(packLoaders) == 0 || modLoaderType == modloaderTypeAny { if len(packLoaders) == 0 || modLoaderType == modloaderTypeAny {
return true // No loaders are specified: allow all files
return modloaderTypeAny, true
} else { } else {
return slices.Contains(packLoaders, modloaderIds[modLoaderType]) if slices.Contains(packLoaders, modloaderIds[modLoaderType]) {
// Pack contains this loader, pass through
return modLoaderType, true
} else {
// Pack does not contain this loader, report unsupported
return modloaderTypeAny, false
}
} }
} }
func matchLoaderTypeFileInfo(packLoaders []string, fileInfoData modFileInfo) bool { func filterFileInfoLoaderIndex(packLoaders []string, fileInfoData modFileInfo) (modloaderType, bool) {
if len(packLoaders) == 0 { if len(packLoaders) == 0 {
return true // No loaders are specified: allow all files
return modloaderTypeAny, true
} else { } else {
containsLoader := false bestLoaderId := -1
for i, name := range modloaderNames { for i, name := range modloaderNames {
if slices.Contains(fileInfoData.GameVersions, name) { // Check if packLoaders and the file both contain this loader type
containsLoader = true if slices.Contains(packLoaders, modloaderIds[i]) && slices.Contains(fileInfoData.GameVersions, name) {
if slices.Contains(packLoaders, modloaderIds[i]) { if i > bestLoaderId {
return true // First loader found, or a loader preferred over the previous one (later IDs are preferred)
bestLoaderId = i
} }
} }
} }
// If a file doesn't contain any loaders, it matches all! if bestLoaderId > -1 {
return !containsLoader // Found a supported loader
return modloaderType(bestLoaderId), true
} else {
// Failed to find a supported version
return modloaderTypeAny, false
}
} }
} }
@ -274,30 +291,35 @@ func matchLoaderTypeFileInfo(packLoaders []string, fileInfoData modFileInfo) boo
func findLatestFile(modInfoData modInfo, mcVersions []string, packLoaders []string) (fileID uint32, fileInfoData *modFileInfo, fileName string) { func findLatestFile(modInfoData modInfo, mcVersions []string, packLoaders []string) (fileID uint32, fileInfoData *modFileInfo, fileName string) {
cfMcVersions := getCurseforgeVersions(mcVersions) cfMcVersions := getCurseforgeVersions(mcVersions)
bestMcVer := -1 bestMcVer := -1
bestLoaderType := modloaderTypeAny
// For snapshots, curseforge doesn't put them in GameVersionLatestFiles // For snapshots, curseforge doesn't put them in GameVersionLatestFiles
for _, v := range modInfoData.LatestFiles { for _, v := range modInfoData.LatestFiles {
mcVerIdx := core.HighestSliceIndex(mcVersions, v.GameVersions) mcVerIdx := core.HighestSliceIndex(mcVersions, v.GameVersions)
loaderIdx, loaderValid := filterFileInfoLoaderIndex(packLoaders, v)
// Choose "newest" version by largest ID // Choose "newest" version by largest ID
// Prefer higher indexes of mcVersions // Prefer higher indexes of mcVersions
if mcVerIdx > -1 && matchLoaderTypeFileInfo(packLoaders, v) && (mcVerIdx >= bestMcVer || v.ID > fileID) { if mcVerIdx > -1 && loaderValid && (mcVerIdx > bestMcVer || loaderIdx > bestLoaderType || v.ID > fileID) {
fileID = v.ID fileID = v.ID
fileInfoData = &v fileInfoData = &v
fileName = v.FileName fileName = v.FileName
bestMcVer = mcVerIdx bestMcVer = mcVerIdx
bestLoaderType = loaderIdx
} }
} }
// TODO: change to timestamp-based comparison?? // TODO: change to timestamp-based comparison??
// TODO: manage alpha/beta/release correctly, check update channel? // TODO: manage alpha/beta/release correctly, check update channel?
for _, v := range modInfoData.GameVersionLatestFiles { for _, v := range modInfoData.GameVersionLatestFiles {
mcVerIdx := slices.Index(cfMcVersions, v.GameVersion) mcVerIdx := slices.Index(cfMcVersions, v.GameVersion)
loaderIdx, loaderValid := filterLoaderTypeIndex(packLoaders, v.Modloader)
// Choose "newest" version by largest ID // Choose "newest" version by largest ID
// Prefer higher indexes of mcVersions // Prefer higher indexes of mcVersions
if mcVerIdx > -1 && matchLoaderType(packLoaders, v.Modloader) && (mcVerIdx >= bestMcVer || v.ID > fileID) { if mcVerIdx > -1 && loaderValid && (mcVerIdx > bestMcVer || loaderIdx > bestLoaderType || v.ID > fileID) {
fileID = v.ID fileID = v.ID
fileInfoData = nil // (no file info in GameVersionLatestFiles) fileInfoData = nil // (no file info in GameVersionLatestFiles)
fileName = v.Name fileName = v.Name
bestMcVer = mcVerIdx bestMcVer = mcVerIdx
bestLoaderType = loaderIdx
} }
} }
return return