mirror of
https://github.com/packwiz/packwiz.git
synced 2025-04-19 13:06:30 +02:00
Fix Quilt+Fabric files from Modrinth being preferred over Fabric (fixes #208)
This commit is contained in:
parent
a344ba11ba
commit
06f9204cd4
@ -122,15 +122,15 @@ var loaderPreferenceList = []string{
|
|||||||
"minecraft",
|
"minecraft",
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMinLoaderIdx(loaders []string) (minIdx int) {
|
// Groups of loaders that should be treated the same as the key, if both versions support the key
|
||||||
minIdx = math.MaxInt
|
// i.e. the key is a more "generic" loader; support for it implies support for the whole group
|
||||||
for _, v := range loaders {
|
// e.g. [quilt, fabric] should compare equal to [fabric] (but less than [quilt] as Quilt support doesn't imply Fabric support)
|
||||||
idx := slices.Index(loaderPreferenceList, v)
|
// This is useful when authors forget to add Quilt/Purpur etc. to all versions
|
||||||
if idx != -1 && idx < minIdx {
|
// TODO: make abstracted from source backend
|
||||||
minIdx = idx
|
var loaderCompatGroups = map[string][]string{
|
||||||
}
|
"fabric": {"quilt"},
|
||||||
}
|
"bukkit": {"purpur", "paper", "spigot"},
|
||||||
return minIdx
|
"bungeecord": {"waterfall"},
|
||||||
}
|
}
|
||||||
|
|
||||||
func getProjectTypeFolder(projectType string, fileLoaders []string, packLoaders []string) (string, error) {
|
func getProjectTypeFolder(projectType string, fileLoaders []string, packLoaders []string) (string, error) {
|
||||||
@ -228,12 +228,50 @@ func parseSlugOrUrl(input string, slug *string, version *string, versionID *stri
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func compareLoaderLists(a []string, b []string) int32 {
|
||||||
|
var compat []string
|
||||||
|
for k, v := range loaderCompatGroups {
|
||||||
|
if slices.Contains(a, k) && slices.Contains(b, k) {
|
||||||
|
// Prerequisite loader is in both lists; add compat group
|
||||||
|
compat = append(compat, v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Prefer loaders; principally Quilt over Fabric, mods over datapacks (Modrinth backend handles filtering)
|
||||||
|
minIdxA := math.MaxInt
|
||||||
|
for _, v := range a {
|
||||||
|
if slices.Contains(compat, v) {
|
||||||
|
// Ignore loaders in compat groups for comparison
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
idx := slices.Index(loaderPreferenceList, v)
|
||||||
|
if idx != -1 && idx < minIdxA {
|
||||||
|
minIdxA = idx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
minIdxB := math.MaxInt
|
||||||
|
for _, v := range b {
|
||||||
|
if slices.Contains(compat, v) {
|
||||||
|
// Ignore loaders in compat groups for comparison
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
idx := slices.Index(loaderPreferenceList, v)
|
||||||
|
if idx < minIdxA {
|
||||||
|
return 1 // B has more preferable loaders
|
||||||
|
}
|
||||||
|
if idx != -1 && idx < minIdxB {
|
||||||
|
minIdxB = idx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if minIdxA < minIdxB {
|
||||||
|
return -1 // A has more preferable loaders
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
func findLatestVersion(versions []*modrinthApi.Version, gameVersions []string, useFlexVer bool) *modrinthApi.Version {
|
func findLatestVersion(versions []*modrinthApi.Version, gameVersions []string, useFlexVer bool) *modrinthApi.Version {
|
||||||
latestValidVersion := versions[0]
|
latestValidVersion := versions[0]
|
||||||
latestValidLoaderIdx := getMinLoaderIdx(versions[0].Loaders)
|
|
||||||
bestGameVersion := core.HighestSliceIndex(gameVersions, versions[0].GameVersions)
|
bestGameVersion := core.HighestSliceIndex(gameVersions, versions[0].GameVersions)
|
||||||
for _, v := range versions[1:] {
|
for _, v := range versions[1:] {
|
||||||
loaderIdx := getMinLoaderIdx(v.Loaders)
|
|
||||||
gameVersionIdx := core.HighestSliceIndex(gameVersions, v.GameVersions)
|
gameVersionIdx := core.HighestSliceIndex(gameVersions, v.GameVersions)
|
||||||
|
|
||||||
var compare int32
|
var compare int32
|
||||||
@ -247,8 +285,7 @@ func findLatestVersion(versions []*modrinthApi.Version, gameVersions []string, u
|
|||||||
compare = int32(gameVersionIdx - bestGameVersion)
|
compare = int32(gameVersionIdx - bestGameVersion)
|
||||||
}
|
}
|
||||||
if compare == 0 {
|
if compare == 0 {
|
||||||
// Prefer loaders; principally Quilt over Fabric, mods over datapacks (Modrinth backend handles filtering)
|
compare = compareLoaderLists(latestValidVersion.Loaders, v.Loaders)
|
||||||
compare = int32(latestValidLoaderIdx - loaderIdx)
|
|
||||||
}
|
}
|
||||||
if compare == 0 {
|
if compare == 0 {
|
||||||
// Other comparisons are equal, compare date instead
|
// Other comparisons are equal, compare date instead
|
||||||
@ -258,7 +295,6 @@ func findLatestVersion(versions []*modrinthApi.Version, gameVersions []string, u
|
|||||||
}
|
}
|
||||||
if compare > 0 {
|
if compare > 0 {
|
||||||
latestValidVersion = v
|
latestValidVersion = v
|
||||||
latestValidLoaderIdx = loaderIdx
|
|
||||||
bestGameVersion = gameVersionIdx
|
bestGameVersion = gameVersionIdx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user