mirror of
https://github.com/packwiz/packwiz.git
synced 2025-04-19 13:06:30 +02:00
Prefer Quilt files to Fabric files from CurseForge (fixes #128)
This commit is contained in:
parent
d38d279d98
commit
4b336e46e2
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user