mirror of
https://github.com/packwiz/packwiz.git
synced 2025-04-19 21:16:30 +02:00
Add support for CF files marked with Quilt (fixes #127)
This commit is contained in:
parent
57b554d5e3
commit
d34728f347
@ -214,7 +214,7 @@ func createModFile(modInfo modInfo, fileInfo modFileInfo, index *core.Index, opt
|
|||||||
return index.RefreshFileWithHash(path, format, hash, true)
|
return index.RefreshFileWithHash(path, format, hash, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLoader(pack core.Pack) int {
|
func getSearchLoaderType(pack core.Pack) int {
|
||||||
dependencies := pack.Versions
|
dependencies := pack.Versions
|
||||||
|
|
||||||
_, hasFabric := dependencies["fabric"]
|
_, hasFabric := dependencies["fabric"]
|
||||||
@ -222,8 +222,12 @@ func getLoader(pack core.Pack) int {
|
|||||||
_, hasForge := dependencies["forge"]
|
_, hasForge := dependencies["forge"]
|
||||||
if (hasFabric || hasQuilt) && hasForge {
|
if (hasFabric || hasQuilt) && hasForge {
|
||||||
return modloaderTypeAny
|
return modloaderTypeAny
|
||||||
} else if hasFabric || hasQuilt { // Backwards-compatible; for now (could be configurable later)
|
} else if hasFabric || hasQuilt {
|
||||||
return modloaderTypeFabric
|
return modloaderTypeFabric
|
||||||
|
} else if hasQuilt {
|
||||||
|
// Backwards-compatible with Fabric for now (could be configurable later)
|
||||||
|
// since we can't filter by more than one loader, just accept any and filter the response
|
||||||
|
return modloaderTypeAny
|
||||||
} else if hasForge {
|
} else if hasForge {
|
||||||
return modloaderTypeForge
|
return modloaderTypeForge
|
||||||
} else {
|
} else {
|
||||||
@ -231,23 +235,41 @@ func getLoader(pack core.Pack) int {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func matchLoaderType(packLoaderType int, modLoaderType int) bool {
|
func getLoaders(pack core.Pack) (loaders []string) {
|
||||||
if packLoaderType == modloaderTypeAny || modLoaderType == modloaderTypeAny {
|
_, hasFabric := pack.Versions["fabric"]
|
||||||
|
if hasFabric {
|
||||||
|
loaders = append(loaders, "fabric")
|
||||||
|
}
|
||||||
|
if _, hasQuilt := pack.Versions["quilt"]; hasQuilt {
|
||||||
|
// Backwards-compatible with Fabric for now (could be configurable later)
|
||||||
|
if !hasFabric {
|
||||||
|
loaders = append(loaders, "fabric")
|
||||||
|
}
|
||||||
|
loaders = append(loaders, "quilt")
|
||||||
|
}
|
||||||
|
if _, hasForge := pack.Versions["forge"]; hasForge {
|
||||||
|
loaders = append(loaders, "forge")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func matchLoaderType(packLoaders []string, modLoaderType int) bool {
|
||||||
|
if len(packLoaders) == 0 || modLoaderType == modloaderTypeAny {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
return packLoaderType == modLoaderType
|
return slices.Contains(packLoaders, modloaderIds[modLoaderType])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func matchLoaderTypeFileInfo(packLoaderType int, fileInfoData modFileInfo) bool {
|
func matchLoaderTypeFileInfo(packLoaders []string, fileInfoData modFileInfo) bool {
|
||||||
if packLoaderType == modloaderTypeAny {
|
if len(packLoaders) == 0 {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
containsLoader := false
|
containsLoader := false
|
||||||
for i, name := range modloaderNames {
|
for i, name := range modloaderNames {
|
||||||
if slices.Contains(fileInfoData.GameVersions, name) {
|
if slices.Contains(fileInfoData.GameVersions, name) {
|
||||||
containsLoader = true
|
containsLoader = true
|
||||||
if i == packLoaderType {
|
if slices.Contains(packLoaders, modloaderIds[i]) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -339,7 +361,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string, pack core.Pack
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
packLoaderType := getLoader(pack)
|
packLoaders := getLoaders(pack)
|
||||||
|
|
||||||
for i, v := range mods {
|
for i, v := range mods {
|
||||||
projectRaw, ok := v.GetParsedUpdateData("curseforge")
|
projectRaw, ok := v.GetParsedUpdateData("curseforge")
|
||||||
@ -358,7 +380,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string, pack core.Pack
|
|||||||
// For snapshots, curseforge doesn't put them in GameVersionLatestFiles
|
// For snapshots, curseforge doesn't put them in GameVersionLatestFiles
|
||||||
for _, v := range modInfos[i].LatestFiles {
|
for _, v := range modInfos[i].LatestFiles {
|
||||||
// Choose "newest" version by largest ID
|
// Choose "newest" version by largest ID
|
||||||
if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaderType, v) {
|
if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaders, v) {
|
||||||
updateAvailable = true
|
updateAvailable = true
|
||||||
fileID = v.ID
|
fileID = v.ID
|
||||||
fileInfoData = v
|
fileInfoData = v
|
||||||
@ -371,7 +393,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string, pack core.Pack
|
|||||||
// 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?
|
||||||
// Choose "newest" version by largest ID
|
// Choose "newest" version by largest ID
|
||||||
if matchGameVersion(mcVersion, file.GameVersion) && file.ID > fileID && matchLoaderType(packLoaderType, file.Modloader) {
|
if matchGameVersion(mcVersion, file.GameVersion) && file.ID > fileID && matchLoaderType(packLoaders, file.Modloader) {
|
||||||
updateAvailable = true
|
updateAvailable = true
|
||||||
fileID = file.ID
|
fileID = file.ID
|
||||||
fileName = file.Name
|
fileName = file.Name
|
||||||
|
@ -89,9 +89,9 @@ var installCmd = &cobra.Command{
|
|||||||
var cancelled bool
|
var cancelled bool
|
||||||
if slug == "" {
|
if slug == "" {
|
||||||
searchTerm := strings.Join(args, " ")
|
searchTerm := strings.Join(args, " ")
|
||||||
cancelled, modInfoData = searchCurseforgeInternal(searchTerm, false, game, category, mcVersion, getLoader(pack))
|
cancelled, modInfoData = searchCurseforgeInternal(searchTerm, false, game, category, mcVersion, getSearchLoaderType(pack))
|
||||||
} else {
|
} else {
|
||||||
cancelled, modInfoData = searchCurseforgeInternal(slug, true, game, category, mcVersion, getLoader(pack))
|
cancelled, modInfoData = searchCurseforgeInternal(slug, true, game, category, mcVersion, getSearchLoaderType(pack))
|
||||||
}
|
}
|
||||||
if cancelled {
|
if cancelled {
|
||||||
return
|
return
|
||||||
@ -114,7 +114,7 @@ var installCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fileInfoData modFileInfo
|
var fileInfoData modFileInfo
|
||||||
fileInfoData, err = getLatestFile(modInfoData, mcVersion, fileID, getLoader(pack))
|
fileInfoData, err = getLatestFile(modInfoData, mcVersion, fileID, getLoaders(pack))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Failed to get file for project: %v\n", err)
|
fmt.Printf("Failed to get file for project: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@ -187,7 +187,7 @@ var installCmd = &cobra.Command{
|
|||||||
depIDPendingQueue = depIDPendingQueue[:0]
|
depIDPendingQueue = depIDPendingQueue[:0]
|
||||||
|
|
||||||
for _, currData := range depInfoData {
|
for _, currData := range depInfoData {
|
||||||
depFileInfo, err := getLatestFile(currData, mcVersion, 0, getLoader(pack))
|
depFileInfo, err := getLatestFile(currData, mcVersion, 0, getLoaders(pack))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error retrieving dependency data: %s\n", err.Error())
|
fmt.Printf("Error retrieving dependency data: %s\n", err.Error())
|
||||||
continue
|
continue
|
||||||
@ -278,7 +278,7 @@ func (r modResultsList) Len() int {
|
|||||||
return len(r)
|
return len(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, category string, mcVersion string, packLoaderType int) (bool, modInfo) {
|
func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, category string, mcVersion string, searchLoaderType int) (bool, modInfo) {
|
||||||
if isSlug {
|
if isSlug {
|
||||||
fmt.Println("Looking up CurseForge slug...")
|
fmt.Println("Looking up CurseForge slug...")
|
||||||
} else {
|
} else {
|
||||||
@ -351,7 +351,7 @@ func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, categ
|
|||||||
} else {
|
} else {
|
||||||
search = searchTerm
|
search = searchTerm
|
||||||
}
|
}
|
||||||
results, err := cfDefaultClient.getSearch(search, slug, gameID, classID, categoryID, filterGameVersion, packLoaderType)
|
results, err := cfDefaultClient.getSearch(search, slug, gameID, classID, categoryID, filterGameVersion, searchLoaderType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Failed to search for project: %v\n", err)
|
fmt.Printf("Failed to search for project: %v\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@ -409,7 +409,7 @@ func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, categ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoaderType int) (modFileInfo, error) {
|
func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoaders []string) (modFileInfo, error) {
|
||||||
if fileID == 0 {
|
if fileID == 0 {
|
||||||
var fileInfoData modFileInfo
|
var fileInfoData modFileInfo
|
||||||
fileInfoObtained := false
|
fileInfoObtained := false
|
||||||
@ -419,7 +419,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader
|
|||||||
for _, v := range modInfoData.LatestFiles {
|
for _, v := range modInfoData.LatestFiles {
|
||||||
anyFileObtained = true
|
anyFileObtained = true
|
||||||
// Choose "newest" version by largest ID
|
// Choose "newest" version by largest ID
|
||||||
if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaderType, v) {
|
if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaders, v) {
|
||||||
fileID = v.ID
|
fileID = v.ID
|
||||||
fileInfoData = v
|
fileInfoData = v
|
||||||
fileInfoObtained = true
|
fileInfoObtained = true
|
||||||
@ -429,7 +429,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader
|
|||||||
for _, v := range modInfoData.GameVersionLatestFiles {
|
for _, v := range modInfoData.GameVersionLatestFiles {
|
||||||
anyFileObtained = true
|
anyFileObtained = true
|
||||||
// Choose "newest" version by largest ID
|
// Choose "newest" version by largest ID
|
||||||
if matchGameVersion(mcVersion, v.GameVersion) && v.ID > fileID && matchLoaderType(packLoaderType, v.Modloader) {
|
if matchGameVersion(mcVersion, v.GameVersion) && v.ID > fileID && matchLoaderType(packLoaders, v.Modloader) {
|
||||||
fileID = v.ID
|
fileID = v.ID
|
||||||
fileInfoObtained = false // Make sure we get the file info
|
fileInfoObtained = false // Make sure we get the file info
|
||||||
}
|
}
|
||||||
|
@ -110,6 +110,7 @@ const (
|
|||||||
modloaderTypeCauldron
|
modloaderTypeCauldron
|
||||||
modloaderTypeLiteloader
|
modloaderTypeLiteloader
|
||||||
modloaderTypeFabric
|
modloaderTypeFabric
|
||||||
|
modloaderTypeQuilt
|
||||||
)
|
)
|
||||||
|
|
||||||
var modloaderNames = [...]string{
|
var modloaderNames = [...]string{
|
||||||
@ -118,6 +119,16 @@ var modloaderNames = [...]string{
|
|||||||
"Cauldron",
|
"Cauldron",
|
||||||
"Liteloader",
|
"Liteloader",
|
||||||
"Fabric",
|
"Fabric",
|
||||||
|
"Quilt",
|
||||||
|
}
|
||||||
|
|
||||||
|
var modloaderIds = [...]string{
|
||||||
|
"",
|
||||||
|
"forge",
|
||||||
|
"cauldron",
|
||||||
|
"liteloader",
|
||||||
|
"fabric",
|
||||||
|
"quilt",
|
||||||
}
|
}
|
||||||
|
|
||||||
//noinspection GoUnusedConst
|
//noinspection GoUnusedConst
|
||||||
|
Loading…
x
Reference in New Issue
Block a user